/**
 * @param {*} fn 需要节流的函数
 * @param {*} interval 时间间隔
 * @param {*} options  leading 第一次是否执行 trailing 最后一次是否执行
 */
const throttle = (
  fn,
  interval,
  options = {
    leading: true,
    trailing: false,
  }
) => {
  const { leading, trailing } = options;
  let lastTime = 0;
  let timer = null;
  const _throttle = function (...args) {
    const nowTime = new Date().valueOf();
    // 如果第一次不执行，把 lasttime 赋值为 nowTime
    if (lastTime === 0 && leading === false) {
      lastTime = nowTime;
    }
    const remainTime = interval - (nowTime - lastTime);
    if (remainTime <= 0) {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
      fn.apply(this, args);
      lastTime = nowTime;
      return;
    }
    /**
     * 如果需要执行最后一次
     */
    if (trailing && !timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null;
        // 如果第一次执行的话，lastTime 一直为 0 会在倒计时执行时，存在执行两次的情况
        lastTime = !leading ? 0 : new Date().valueOf();
      }, remainTime);
    }
  };
  _throttle.cancel = () => {
    clearTimeout(timer);
    timer = null;
    lastTime = 0;
  };
  return _throttle;
};

// 函数用于获取URL参数
function getURLParameter(name) {
  // 如果参数名为空，则返回null

  if (!name) return null;
  // 创建正则表达式，用于匹配参数名
  let reg = new RegExp(`[?&]${name}(=([^&#]*)|&|#$)`);
  // 使用正则表达式匹配当前URL
  let result = reg.exec(window.location.href);
  // 如果没有匹配到，则返回null
  if (!result) return null;
  // 如果匹配到的参数值为空，则返回空字符串
  if (!result[2]) return "";
  // 对参数值进行解码
  return decodeURIComponent(result[2].replace(/\+/g, ""));
}

/**
 *
 * @param {String} encryptedEmail 邮箱解密
 * @returns
 */
/*async function decryptEmail(encryptedEmail) {
  try {
    const key = CryptoJS.enc.Utf8.parse("ThisIsASecretKey"); // 确保密钥与后端一致
    const encryptedEmailBytes = CryptoJS.enc.Base64.parse(encryptedEmail);
    const decryptedEmailBytes = CryptoJS.AES.decrypt(
      {
        ciphertext: encryptedEmailBytes,
      },
      key,
      {
        mode: CryptoJS.mode.ECB, // 可能需要根据后端的模式进行更改
        padding: CryptoJS.pad.Pkcs7,
      }
    );

    return decodeURIComponent(decryptedEmailBytes.toString(CryptoJS.enc.Utf8));
  } catch (error) {
    console.error("邮件解密失败: " + error.message);
    return null;
  }
}*/

/**
 * 创建 Modal
 * @param {String} modalDomId
 * @param {Function} submitFunc 提交
 * @param {Function}  handleCloseCallback 处理关闭的回调函数
 */
function generatorModal(modalDomId, submitFunc, handleCloseCallback) {
  return {
    modal: new bootstrap.Modal(document.getElementById(modalDomId), {
      keyboard: false,
      backdrop: "static",
    }),
    show() {
      this.modal.show();
      this.onClose();

    },
    hide() {
      this.modal.hide();
    },
    submit() {
      $(`#${modalDomId} .btn`).on("click", submitFunc);
    },
    onClose: function () {
      const myModalEl = document.getElementById(modalDomId);
      myModalEl.addEventListener("hidden.bs.modal", handleCloseCallback);
    },
  };
}

function showModal(modalDomId, msg) {
  const modalBodyContent = $(`#${modalDomId} .modal-body .content`);
  modalBodyContent.html(msg);

}

/**
 *
 * @param func 防抖的方法
 * @param wait 等待时间
 * @returns {(function(): void)|*}
 */

function debounce(func, wait) {
  let timeout;
  return function () {
    const context = this;
    const args = arguments;
    clearTimeout(timeout);
    timeout = setTimeout(function () {
      func.apply(context, args);
    }, wait);
  };
}
//初始化的时候隐藏其他div

function initializeFormWithHiddenInputs(formContainerSelector) {
  $(formContainerSelector).find(".form-item:not(:first-child):not(:nth-child(2))").hide();

  // 显示初始有值的input的父div
  $(formContainerSelector)
    .find("input")
    .each(function () {
      const $this = $(this);

      const $parentDiv = $this.closest(".form-item");
      if ($this.val().trim()) {
        $parentDiv.show();
      }
    });

  // 使用CSS隐藏第三个及之后的div
  //

  // 监听所有input的值变化
  $(formContainerSelector)
    .find("input:gt(1)")
    .on("input", function () {
      const $this = $(this);
      const $parentDiv = $this.closest(".form-item");

      // 当input的值不为空时显示其父div
      if ($this.val().trim()) {
        $parentDiv.show();
      } else {
        // 当input的值为空时隐藏其父div
        $parentDiv.hide();
      }
    });
}

/**
 * 显示指定输入框所在的 .form-item.order-box div 元素。
 * @param {string} inputId - 输入框的 ID。
 */
function showOrderBoxForInput(inputId) {
  // 使用 jQuery 找到输入框元素
  const $input = $(`#${inputId}`);

  // 使用 closest 方法找到最近的 .form-item.order-box div
  const $orderBox = $input.closest(".form-item.order-box");

  // 显示找到的 div 元素
  $orderBox.show(); // 如果之前是隐藏的，这将使其可见

  // 返回找到的 div 元素，以便进一步操作
  return $orderBox;
}



/**
 * 影藏指定输入框所在的 .form-item.order-box div 元素。
 * @param {string} inputId - 输入框的 ID。
 */
function hideBoxForInput(inputId) {
  // 使用 jQuery 找到输入框元素
  const $input = $(`#${inputId}`);

  // 使用 closest 方法找到最近的 .form-item.order-box div
  const $orderBox = $input.closest(".form-item.order-box");

  // 显示找到的 div 元素
  $orderBox.hide(); // 如果之前是隐藏的，这将使其可见

  // 返回找到的 div 元素，以便进一步操作
  return $orderBox;
}
/**
 * 获取包含禁用状态的序列化的表单
 * @param formId
 * @returns {*[]}
 */
function serializeFormWithDisabled(formId) {
  let form = $(formId);
  let serializedData = [];

  form.find(":input").each(function () {
    let $this = $(this);
    if ($this.attr("type") !== "submit" && $this.attr("type") !== "reset") {
      serializedData.push({
        name: $this.attr("name"),
        value: $this.val(),
      });
    }
  });

  return serializedData;
}

/**
 *  用于回显投诉原因和投诉描述数据
 * @param reasonText 填写的描述
 * @param OptionValue 选择的投诉原因
 */
function setComplaintFields(reasonText, OptionValue) {
  if (reasonText) {
    $("#complaintDescription").val(reasonText);
    showOrderBoxForInput("complaintDescription");
  }

  if (OptionValue) {
    $("#complaintCause").val(OptionValue);
    showOrderBoxForInput("complaintCause");
  }
}

/** 批量设置字段
 *
 * @param fields
 */

function updateAndShowFields(fields) {
  for (const fieldId in fields) {
    const value = fields[fieldId];
    if (value) {
      $(fieldId).val(value);
      showOrderBoxForInput(fieldId.replace("#", ""));
    }
  }
}

function downloadpath() {
  let baseUrl = getBaseUrl();
  if (baseUrl == "http://admin.banlingkit.com:8012") {
    return baseUrl.replace("8012", "8015");
  } else {
    return baseUrl;
  }
}

var exportFile = function (url) {
  return downloadpath() + url.replace(/^d\:\/data|^\/data/i, "");
};

function clearModalInputs(modalId) {
  var modal = document.querySelector(modalId);
  if (modal) {
    modal.addEventListener("show.bs.modal", function (event) {
      debugger;
      var inputs = modal.querySelectorAll(
        'textarea, input[type="text"], input[type="email"], input[type="password"]'
      );
      Array.from(inputs).forEach(function (input) {
        input.value = "";
      });

      var fileInputs = modal.querySelectorAll('input[type="file"]');
      Array.from(fileInputs).forEach(function (fileInput) {
        fileInput.value = null;
      });

      var selectInputs = modal.querySelectorAll("select");
      Array.from(selectInputs).forEach(function (select) {
        select.selectedIndex = -1; // 重置选择框到第一个选项
      });

      var checkboxes = modal.querySelectorAll('input[type="checkbox"]');
      Array.from(checkboxes).forEach(function (checkbox) {
        checkbox.checked = false; // 清除复选框的选择
      });

      var radioButtons = modal.querySelectorAll('input[type="radio"]');
      Array.from(radioButtons).forEach(function (radio) {
        radio.checked = false; // 清除单选按钮的选择
      });
    });
  }
}

function clearModals() {
  const modalIds = ["#complaintModal", "#uploadImgModal", "#accountInfoModal", "#refundModal"];
  // 遍历模态框 ID 数组
  modalIds.forEach((modalId) => {
    clearModalInputs(modalId);
  });
}
